package sistemaDefensivo;

import comunicacion.Cliente;
import comunicacion.Mensaje;

import escenario.Escenario;
import escenario.IdPosicion;
import escenario.Misil;
import escenario.Posicion;

public class MisilDefensor extends Misil {

	private IdPosicion idPos;
	private int portRespAttk;
	private Mensaje mensaje;
	private Cliente clientMisDef;
	private String ipRespAttk;
	boolean alive;
	
	
	public MisilDefensor(){

	}
	
	public MisilDefensor(Escenario esc){
		this.setEscenario(esc);
		this.alive = true;
	}

	public int getPortRespAttk() {
		return portRespAttk;
	}

	public void setPortRespAttk(int portRespAttk) {
		this.portRespAttk = portRespAttk;
	}

	public String getIpRespAttk() {
		return ipRespAttk;
	}

	public void setIpRespAttk(String ip) {
		this.ipRespAttk = ip;
	}

	public boolean isAlive() {
		return alive;
	}

	public void setAlive(boolean alive) {
		this.alive = alive;
	}
	
	public IdPosicion getIdPos() {
		return idPos;
	}
	
	private void setIdpos(double x, double y, double z){
		idPos.setX(x);
		idPos.setY(y);
		idPos.setZ(z);
	}
	
	private Posicion setDestinoMD(){
		Posicion temp = new Posicion();
		temp.setX(mensaje.getX());
		temp.setY(mensaje.getY());
		temp.setZ(mensaje.getZ());
		return temp;
	}
	
	private Posicion setOrigenMD(){
		Posicion temp = new Posicion();
		temp.setX(mensaje.getXDest());
		temp.setY(mensaje.getYDest());
		temp.setZ(mensaje.getZDest());
		return temp;
	}
	
	private void cambiarEje(){
//		Calculamos el vector de trayectoria
			double x1, x2, y1, y2, z1, z2;
			double x, y, z, dX, dY, dZ;
			x1 = this.getOrigen().getX();
			y1 = this.getOrigen().getY();
			z1 = this.getOrigen().getZ();
			x2 = this.getDestino().getX();
			y2 = this.getDestino().getY();
			z2 = this.getDestino().getZ();
			x = x2 - x1;
			y = y2 - y1;
			z = z2 - z1;	
			
//			System.out.println("VALORES RELATIVOS DE MISIL DEFENSOR---- X:" + x + "  Y:" + y + "  Z:" + z);
			
			
//			Actualizamos las posiciones del objeto posicionRel en Misil
			setPosicionRel(x, y, z);
//			Calculamos radio, tita y fi a partir del vector de trayectoria
			this.getPosicionRel().actualizarEsfericas(x, y);
//			Seteamos objeto posicion en AtributoEscenario (POSICION ABSOLUTA)
			dX = this.getOrigen().getX();
			dY = this.getOrigen().getY();
			dZ = this.getOrigen().getZ();
			setPosicion(x+dX, y+dY, z+dZ);
			this.getPosicion().actualizarEsfericas(x+dX, y+dY);
//			FALTA AGREGAR AL MONITOR ESPACIO LOS METODOS PARA CAMBIAR POSICIONES DE MISILES DEFENSIVOS
//			this.getEscenario().setPosDefensivo(this.getId(), x+dX, y+dY, z+dZ, x2, y2, z2);
		}
	
	public void mover(){
		this.getPosicionRel().setRadio(this.getPosicionRel().getRadio() - 0.01);
		this.getPosicionRel().actualizarCartesianas();
//		Actualizamos el objeto posicion de AtributoEscenario con las posiciones Absolutas
		double xAbs = this.getDestino().getX() - this.getPosicionRel().getX();
		double yAbs = this.getDestino().getY() - this.getPosicionRel().getY();
		double zAbs = this.getDestino().getZ() - this.getPosicionRel().getZ();
		setPosicion(xAbs, yAbs, zAbs);
		this.setIdpos(xAbs, yAbs, zAbs);
//		System.out.println("VALORES ABSOLUTOS DEL MISIL DEFENSOR:" + this.getId() +  "  X:" + this.getPosicion().getX() + "  Y:" + 
//				this.getPosicion().getY() + "  Z:" + this.getPosicion().getZ());
		
		this.getPosicion().actualizarEsfericas(xAbs, yAbs);
		this.getEscenario().setPosDefensor(this.getId(), xAbs, yAbs, zAbs, 
				this.getDestino().getX(), this.getDestino().getY(),	this.getDestino().getZ());
//		printPosAbs();
	}

	@Override
	public void colision(){
		System.out.println("\nMISIL DEFENSOR: " + this.getId() + " dice ==================> IMPACTE");
		this.getEscenario().removePosDefensor(this.getId());
		this.getEscenario().removeMisilDefensor(this);
		clientMisDef.createClient();
		clientMisDef.sendDataInt(-1);
		clientMisDef.close();
		alive = false;
	}	
	
	public void setPosInicialRel(){
//		Objeto clase Posicion temporal para setear objeto posicionRel en Misil
		Posicion nueva = new Posicion();
		nueva.setX(this.getDestino().getX());
		nueva.setY(this.getDestino().getY());
		nueva.setZ(this.getDestino().getZ());
		setPosicionRel(nueva);		
	}
	
//	Si el MisilDefensor supera su alcance debe ser eliminado
	public boolean alcanceMisil(){
		if(this.getPosicion().getRadio() < 50)
			return true;
		else
			return false;	
	}
	
	public void run(){
		this.getEscenario().addMisilDefensor(this);
		clientMisDef = new Cliente(this.ipRespAttk, portRespAttk);
		clientMisDef.createClient();
		mensaje = clientMisDef.readObject();
		clientMisDef.close();
//		Seteamos parametros iniciales del Misil Defensivo
		this.setId(mensaje.getId());
		
		System.out.println("\nMISIL DEFENSOR dice =====================> Se lanzo el MISIL DEFENSOR: " + this.getId());
		
		this.setDestino(setDestinoMD());
		this.setOrigen(setOrigenMD());
		setPosInicialRel();
		this.cambiarEje();
		idPos = new IdPosicion(this.getId());
		this.setIdpos(this.getDestino().getX(), this.getDestino().getY(), this.getDestino().getZ());
		this.getEscenario().addPosDefensor(idPos);
//		keep alive
		clientMisDef.createClient();
		clientMisDef.sendDataInt(this.getId());
		clientMisDef.close();
		this.mover();

		while(alcanceMisil() && alive){
			this.mover();
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(alive){
			System.out.println("\nMISIL DEFENSOR: " + this.getId() + " dice ==================> Me Fui de Rango");
			this.colision();
		}
	}

}